iT邦幫忙

2022 iThome 鐵人賽

DAY 4
2
DevOps

從零開始的 Jenkins 之旅系列 第 4

第四天 Jenkins 之旅:Jenkinsfile 語法介紹(1)

  • 分享至 

  • xImage
  •  

前言

昨天說 "Jenkins 可能會突然死去",就在今天 GitLab 在 19:00 ~ 22:00 進入維運模式,導致我們公司因為 SCM 失敗而使得眾多 Pipeline 直接見紅,在此紀錄一下 QQ

fuuk gitlab 503

不說了 ...... 回到正題,今天讓我們一起學習 Jenkinsfile 的寫法吧 ~

起手式

回到我們最初的 Jenkinsfile,可以大致用 {} 來切分各個區塊以及從屬狀態,這邊利用 IDE 就可以簡單地觀察出階層關係。
first sample jenkinsfile

  • pipeline 是整個 Jenkinsfile 最核心的語法,我們需要在 pipeline 的區塊內完整撰寫出我們的 pipeline 流程。

  • agent 用來宣告我們 pipeline 想要在哪一個 jenkins 節點上進行執行,也可以根據每一個 stage 分別宣吿個別的執行節點。常見的幾個寫法:

    • agent any : 代表的是 pipeline 執行可以在任意節點執行。
    • agent {label "[LABEL]"} : 指定 pipeline 執行需要在指定的主機類型來執行。
    • agent none: 代表的是 pipeline 執行暫時不指定任何節點執行。(如果是agent none 的話,會需要在 stage 下指定 agent 不然在 pipeline 執行的時候,jenkins 報錯。)
pipeline {
    agent none
    stages {
        stage ("job 1") {
            agent {label "master"}
            ......
        }
        stage ("job 2") {
            agent any
            ......
        }        
    }
}

更多的 agent 類型宣告請參考 Jenkins 官方網站介紹

  • stages 實際處理 pipeline 內部流程。
  • stage 細部處理每一個步驟的邏輯宣告。一般來說一個 stages 會有多個 stage
  • steps 可以定義在每一個 stage 內更細部的流程安排。
pipeline {
    agent any
    stages {
        stage ("Stage 1") {
            steps{
                echo "Stage 1 - command 1"
                echo "Stage 1 - command 2"
                echo "Stage 1 - command 3"
            }
        }
        stage ("Stage 2") {
            steps{
                echo "Stage 2 - command 1"
                echo "Stage 2 - command 2"
            }
        }
    }
}

multi command

  • echo 跟在 linux 中的 echo 指令一樣,可以用來打印訊息。
  • sh 可用來執行 shell script 或 linux 指令。

來個例子

現在接到一個業務需求,希望我們去監控 www.example.com 是否可被正常訪問 (Response code 200)。當不能被正常訪問時發出 telegram 告警。

https://ithelp.ithome.com.tw/upload/images/20220904/20151613IdYAcG6jte.png

我們用今天介紹到的 Jenkinsfile 語法,以及 linux 即可組合出下列 Pipeline。
Github Link

pipeline {
    agent any
    stages {
        stage ("Check www.example.com response code") {
            steps{
                sh  '''
                    TOKEN="test-token"
                    GROUP_ID="-000000000"
                    CODE=$(curl -o /dev/null -s -w %{http_code} www.example.com)
                    
                    
                    if [ "${CODE}" != "200" ]; then
                      message="www.example.com response code != 200."
                      curl -X GET "https://api.telegram.org/bot${TOKEN}/sendMessage" \
                          -d "chat_id=${GROUP_ID}&text=${message}"
                    fi                
                '''
            }
        }
    }
}

day4 job man page

+ TOKEN=test-token
+ GROUP_ID=-000000000
+ curl -o /dev/null -s -w %{http_code} www.example.com
+ CODE=200
+ [ 200 != 200 ]

小結

今天我們利用 Jenkinsfile 基礎元件,組合出第一個實際可被運行的 pipeline,但是目前可以發現還有幾點可以優化

  • TOKEN 與 GROUP_ID 是明碼。
  • 未設定排程定時執行,目前只能以手動進行。
  • sh 包含的內容過於複雜(test response code + alert)為符合職責單一原則,導致閱讀上有障礙。

明天讓我們介紹新的 Jenkinsfile 元件來進行這個 website-code pipeline 的優化吧。

參考資料

Pipeline Syntax


上一篇
第三天 Jenkins 之旅: 管理你的 Jenkinsfile
下一篇
第五天 Jenkins 之旅:Jenkinsfile 語法介紹(2)
系列文
從零開始的 Jenkins 之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言